/*
    对于消息中可枚举字段进行类型定义和定义宏名
    1.body中字段定义宏名
    2.消息类型定义
    3.响应状态码类型定义以及转错误信息函数
    4.rpc请求类型定义
    5.主题和服务操作类型定义
*/
#pragma once
#include <string>
#include <unordered_map>

namespace ns_jsonrpc
{
    // body中字段定义宏名
    #define KEY_METHOD "method"     // rpc请求方法名称
    #define KEY_PARAMS "parameters" // rpc请求参数

    #define KEY_TOPIC_KEY "topic_key" // 主题名称
    #define KEY_TOPIC_MSG "topic_msg" // 发布主题消息
    #define KEY_OPTYPE "optype"       // 主题操作类型/服务操作类型

    #define KEY_HOST "host"      // 节点地址
    #define KEY_HOST_IP "ip"     // 节点ip
    #define KEY_HOST_PORT "port" // 节点port

    #define KEY_RCODE "rcode"   // 响应状态码
    #define KEY_RESULT "result" // rpc调用结果

    // 消息类型定义
    enum class MType
    {
        REQ_RPC = 0, // rpc请求
        RSP_RPC,     // rpc响应
        REQ_TOPIC,   // 主题请求
        RSP_TOPIC,   // 主题响应
        REQ_SERVICE, // 服务请求
        RSP_SERVICE, // 服务响应
    };

    // 响应状态码类型定义
    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };

    // 错误码对应的错误信息
    static std::string errReason(RCode code)
    {
        static std::unordered_map<RCode, std::string> err_map = {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "无效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}
        };
        auto it = err_map.find(code);
        if (it == err_map.end())
        {
            return "未知错误！";
        }
        return it->second;
    }

    // 请求方式类型定义
    enum class RType                                                                   
    {
        REQ_ASYNC = 0,    // 异步
        REQ_CALLBACK  // 回调
    };

    // 主题操作类型定义
    enum class TopicOpType
    {
        TOPIC_CREATE = 0, // 创建主题
        TOPIC_REMOVE,     // 删除主题
        TOPIC_SUBSCRIBE,  // 订阅主题
        TOPIC_CANCEL,     // 取消订阅主题
        TOPIC_PUBLISH     // 发布主题消息
    };

    // 服务操作类型定义
    enum class ServiceOpType
    {
        SERVICE_REGISTRY = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 上线通知
        SERVICE_OFFLINE,      // 下线通知
        SERVICE_UNKNOWN       // 未知
    };
}